package componentes;

import java.awt.Color;

public class Celda {
	
	private Tablero tablero;
	private boolean hayTesoro = false; 
	private boolean celdaOcupada = false; // ww
	private Jugador jugador = null;
	
	//celdas lindantes
	private Celda celdaNorte = null;
	private Celda celdaEste = null;
	private Celda celdaOeste = null;
	private Celda celdaSur = null;
			
	
	Celda(Tablero tablero){
		this.tablero = tablero;
	}
	
	public Celda getCeldaNorte(){
		return this.celdaNorte;
	}
	
	public Celda getCeldaSur(){
		return this.celdaSur;
	}
	
	public Celda getCeldaEste(){
		return this.celdaEste;
	}
	
	public Celda getCeldaOeste(){
		return this.celdaOeste;
	}
	
	public Jugador getJugador(){
		return this.jugador;
	}
	public Tablero getTablero(){
		return this.tablero;
	}
	
	public void sacarTesoro(){
		this.hayTesoro = false;
	}

	public void ponerTesoro() {
		this.hayTesoro = true;
	}
	
	public boolean hayTesoro(){
		return this.hayTesoro;
	}
	
	public boolean ocupada() {
		return celdaOcupada;
	}
	public boolean ocupada(Jugador j){
		if (celdaOcupada){
			return this.getJugador().comparteEquipo(j);
		}
		return false;
	}

	public void setCeldaOcupada(boolean celdaOcupada) {
		this.celdaOcupada = celdaOcupada;
	}
	
	public void ocuparCelda(){
		this.setCeldaOcupada(true);
	}
	
	public void desocuparCelda(){
		this.setCeldaOcupada(false);
	}


	public void ponerJugador(Jugador jugador) {
		ocuparCelda();
		this.jugador = jugador;
		jugador.setCelda(this);
	}
	
	//Inmediatamente se debe poner el jugador en otra celda, porque se
	//queda en la nada
	public Jugador sacarJugador(){
		desocuparCelda();
		Jugador jugador = this.jugador;
		this.jugador = null;
		jugador.setCelda(null);
		return jugador;
	}
	
	public void setLindantes(){
		this.celdaNorte = this.tablero.lindanteNorte(this);
		this.celdaEste = this.tablero.lindanteEste(this);
		this.celdaOeste = this.tablero.lindanteOeste(this);
		this.celdaSur = this.tablero.lindanteSur(this);
	}

	
	private void desplazarAl(Celda celda) throws InterruptedException{
		//
		//Jugador jugDesp = this.sacarJugador();
		//celda.ponerJugador(jugDesp);
		this.tablero.getMonitor().desplazarCeldas(this,celda);
		
		//this.tablero.controlDeImpresion();
		
	}
	
	protected boolean sinRespaldos() {
		return tablero.sinRespaldo(this);
	}

	protected boolean hayTesoroPropio(Celda celda){
		if(celda.hayTesoro)
			return jugador.esCoordPropia(tablero.dameCoordDe(celda),tablero.getSize());

		return false;
	}
	
	protected boolean hayTesoroEnemigo(Celda celda){
		if(celda.hayTesoro)
			return !hayTesoroPropio(celda);
		return false;
	}
	
	public void robarTesoroEnemigo(Celda celda, Jugador jugador){
		celda.hayTesoro = false;
		jugador.sumarPuntos(this.tablero);
	}
	
	public void desplazarAlEste() throws InterruptedException {
		desplazarAl(celdaEste);
	}
	
	public void desplazarAlOeste() throws InterruptedException {
		desplazarAl(celdaOeste);
	}
	
	public void desplazarAlNorte() throws InterruptedException {
		if(this.jugador.esPosibleMover(Movimiento.NORTE))
			desplazarAl(celdaNorte);
	}
	
	public void desplazarAlSur() throws InterruptedException{
		if(this.jugador.esPosibleMover(Movimiento.SUR))
			desplazarAl(celdaSur);
	}

	@Override
	public String toString(){
		String st = "|";
		if(hayTesoro && !celdaOcupada)
			st +="T";
		if(celdaOcupada)
			st += jugador.concatenarJugador();
		if(!hayTesoro && !celdaOcupada)
			st += " ";
		return st += "|";
	}
	
	public Color miColor(){

		if(hayTesoro && !celdaOcupada)
			return Color.yellow;
		if(celdaOcupada)
			return jugador.miColor();

		return Color.gray;


	}
}

	

